package com.hyacinth.aurora.core.plugin;

import com.hyacinth.aurora.constant.Constant;
import com.hyacinth.aurora.core.ClassHelper;
import com.hyacinth.aurora.core.exception.InitializationError;
import com.hyacinth.aurora.core.exception.SingleClassInstanceException;
import com.hyacinth.aurora.core.init.Initialization;

import java.util.ArrayList;
import java.util.List;

/**
 * 初始化插件
 *
 * @author huangyong
 * @since 2.0
 */
public class PluginHelper extends Initialization {

    /**
     * 创建一个插件列表（用于存放插件实例）
     */
    private final List<Plugin> pluginList = new ArrayList<>();

    private PluginHelper() throws SingleClassInstanceException {
        super();
    }

    @Override
    protected void doInit() throws Exception {
        // 获取并遍历所有的插件类（实现了 Plugin 接口的类）
        List<Class<?>> pluginClassList = ClassHelper.getClassListBySuper(Constant.PLUGIN_PACKAGE, Plugin.class);
        for (Class<?> pluginClass : pluginClassList) {
            // 创建插件实例
            Plugin plugin = (Plugin) pluginClass.newInstance();
            // 调用初始化方法
            plugin.init();
            // 将插件实例添加到插件列表中
            pluginList.add(plugin);
        }
    }

    @Override
    protected void doDestroy() throws Exception {
        destroyPlugins();
    }

    /**
     * 获取所有插件
     */
    private List<Plugin> getPluginList() {
        return pluginList;
    }

    /**
     * 销毁插件
     */
    private void destroyPlugins() {
        List<Plugin> pluginList = getPluginList();
        for (Plugin plugin : pluginList) {
            plugin.destroy();
        }
    }
}
